#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
主题:字典中的键映射多个值
问题: 怎样实现一个键对应多个值的字典（也叫 multidict）？
提示 : 
"""

from collections import defaultdict


def recipe1():
    '''你可以很方便的使用 collections 模块中的 defaultdict 来构造这样的字典'''
    l = defaultdict(list)
    l['a'].append(1)
    l['a'].append(1)
    l['b'].append(4)
    print(f"{l = }")

    s = defaultdict(set)
    s['a'].add(1)
    s['a'].add(1)
    s['b'].add(4)
    print(f"{s = }")


def recipe2():
    '''defaultdict 会自动为将要访问的键（就算目前字典中并不存在这样的键）创建映射实体'''
    d = {}  # 一个普通的字典
    d.setdefault('a', []).append(1)
    d.setdefault('a', []).append(2)
    d.setdefault('b', []).append(4)
    print(f"{d = }")


def recipe3():
    '''创建一个多值映射字典'''
    pairs = [('a', 1), ('a', 1), ('b', 2)]
    d = {}
    for key, value in pairs:
        if key not in d:
            d[key] = []
        d[key].append(value)
    print(f"{d = }")


def recipe4():
    '''创建一个多值映射字典: 使用 defaultdict 的话代码就更加简洁'''
    pairs = [('a', 1), ('a', 1), ('b', 2)]
    d = defaultdict(list)
    for key, value in pairs:
        d[key].append(value)
    print(f"{d = }")


def main():
    print('recipe1'.center(20,'*'))
    recipe1()
    print('recipe2'.center(20,'*'))
    recipe2()
    print('recipe3'.center(20,'*'))
    recipe3()
    print('recipe4'.center(20,'*'))
    recipe4()


if __name__ == '__main__':
    main()
